
package DAO;

import Entidad.*;
import Singletons.Mensajes;
import java.util.*;
import javax.persistence.*;

/**
 * @author John
 */

public class UsuarioDAO {

    /**
     * <p>Registra en la base de datos un nuevo usuario
     * @param usuario Usuario qua va ha ser guardado en la base de datos
     * @param em EntityManager que se encarga del proceso de guardado
     * @return true si se completo la persistencia del usuario, false de lo contrario
     * @throws PersistenceException
     */
    public void crear(Usuario usuario,EntityManager em) throws PersistenceException {
        try{
            em.persist(usuario);
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
    }

    /**
     * <p>Actualiza en la base de datos un usuario existente
     * @param usuario Usuario ya registrado en la base de datos que tiene los nuevos datos
     * @param em EntityManager que se encarga del proceso de actualizacion
     * @return true si se completo la actualizacion del usuario, false de lo contrario
     * @throws PersistenceException
     */
    public void actualizar(Usuario usuario,EntityManager em) throws PersistenceException {
        try{
            em.merge(usuario);
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
    }

    /**
     * <p>Elimina de la base de datos al usuario pasado como argumento
     * @param usuario Usuario que se va a eliminar de la base de datos
     * @param em EntityManager que se encarga del proceso de busqueda y eliminacion
     * @return true si se completo la eliminacion del usuario, false de lo contrario
     * @throws PersistenceException
     */
    public void eliminar(Usuario usuario,EntityManager em) throws PersistenceException {
        try{
            em.remove(em.merge(usuario));
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
    }

    /**
     * <p>Busca en la base de datos un usuario cuyo correo sea el indicado
     * @param correo String con el correo del Usuario que se va a buscar
     * @param em EntityManager que se encarga del proceso de busqueda
     * @return usuario cuyo correo coincida con el argumento pasado o null si no lo encuentra
     * @throws PersistenceException
     */
    public Usuario encontrarUsuarioPorCorreo(String correo,EntityManager em) throws PersistenceException {
        Usuario usuario;
        try{
            usuario=em.find(Usuario.class, correo);
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return usuario;
    }

    /**
     * <p>Busca en la base de datos un usuario cuya cedula sea la indicada
     * @param cedula long con el numero de identificacion del Usuario que se va a buscar
     * @param em EntityManager que se encarga del proceso de busqueda
     * @return usuario cuya cedula coincida con el argumento pasado o null si no lo encuentra
     * @throws PersistenceException
     */
    public Usuario encontrarUsuarioPorCedula(long cedula,EntityManager em) throws PersistenceException {
        Usuario usuario;
        try{
            Query query=em.createQuery("SELECT u FROM Usuario u WHERE u.cedula=:cedula").setParameter("cedula", cedula);
            usuario=(Usuario)query.getSingleResult();
        }catch(NoResultException e){
            usuario=null;
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return usuario;
    }

    /**
     * <p>Busca en la base de datos un usuario cuyo codigo sea el indicado
     * @param codigo int con el codigo del Usuario que se va a buscar
     * @param em EntityManager que se encarga del proceso de busqueda
     * @return usuario cuyo codigo coincida con el argumento pasado o null si no lo encuentra
     * @throws PersistenceException
     */
    public Usuario encontrarUsuarioPorCodigo(int codigo,EntityManager em) throws PersistenceException {
        Usuario usuario;
        try{
            Query query=em.createQuery("SELECT u FROM Usuario u WHERE u.codigo=:codigo").setParameter("codigo", codigo);
            usuario=(Usuario)query.getSingleResult();
        }catch(NoResultException e){
            usuario=null;
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return usuario;
    }
    
    /**
     * <p> Busca en la base de datos el primer usuario que tenga el correo, la cedula o el codigo
     * pasado como argumento</p>
     * @param correo String con el correo del Usuario que se va a buscar
     * @param cedula long con el numero de identificacion del Usuario que se va a buscar
     * @param codigo int con el codigo del Usuario que se va a buscar
     * @param em EntityManager que se encarga del proceso de busqueda
     * @return usuario cuyo codigo coincida con el primer argumento, cedula con el segundo o codigo con el tercero. Retorna null de lo contrario
     * @throws PersistenceException
     */
    public Usuario encontrarUsuario(String correo,long cedula,int codigo,EntityManager em) throws PersistenceException {
        Usuario usuario;
        String queryS="SELECT u FROM Usuario u WHERE u.correo=:correo OR u.cedula=:cedula OR u.codigo=:codigo";
        try{
            Query query=em.createQuery(queryS).setParameter("correo", correo).setParameter("cedula", cedula).setParameter("codigo", codigo);
            usuario=(Usuario)query.getSingleResult();
        }catch(NoResultException e){
            usuario=null;
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return usuario;
    }

    /**
     * <p>Busca en la base de datos todos los usuarios registrados y los retorna en una lista</p>
     * @param em EntityManager que se encarga del proceso de busqueda
     * @return Lista con todos los usuarios de la base de datos
     * @throws PersistenceException
     */
    public ArrayList<Usuario> listaUsuarios(EntityManager em) throws PersistenceException {
        ArrayList<Usuario> usuarios=new ArrayList<Usuario>();
        try{
            Query query=em.createQuery("SELECT u FROM Usuario u");
            List objectosUsuario=query.getResultList();
            for(Object o:objectosUsuario)
                usuarios.add((Usuario)o);
        }catch(NoResultException e){
            usuarios=new ArrayList<Usuario>();
        }catch (Exception e) {
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return usuarios;
    }

}